#include "usermodel.h"
#include "db.h"
#include <iostream>
using namespace std;
bool UserModel::insert(User &user)
{
    char sql[1024] = {0};
    sprintf(sql, "insert into user(name,password,state) values('%s','%s','%s');",
            user.getName().c_str(), user.getPassword().c_str(), user.getState().c_str());
    MySQL mysql;
    if (mysql.connect())
    {
        if (mysql.update(sql))
        {
            // 获取插入成功插入数据行的id，其实也就是获取给user对象设置id便于后续获取，User默认构造id=-1
            user.setId(mysql_insert_id(mysql.getConnection()));
            return true;
        }
    }
    return false;
}

void UserModel::resetState()
{
    char sql[1024] = "update user set state='offline' where state='online';";
    MySQL mysql;
    if (mysql.connect())
    {
        mysql.update(sql);
    }
}

User UserModel::query(int id)
{
    char sql[1024] = {0};
    sprintf(sql, "select * from user where id = %d;", id);
    MySQL mysql;
    if (mysql.connect())
    {
        MYSQL_RES *res = mysql.query(sql);
        if (res != nullptr)
        {
            //仅仅获取第一行信息，mysql_fetch_row会自动获取当前行的信息情况，搭配while循环自动后移
            MYSQL_ROW row = mysql_fetch_row(res);
            if (row != nullptr)
            {
                User user;
                user.setId(atoi(row[0]));
                user.setName(row[1]);
                user.setPassword(row[2]);
                user.setState(row[3]);
                // 释放MYSQL_RES* res内存空间
                mysql_free_result(res);
                // 因为主键id查询，所以只有一行，否则就循环
                return user;
                //释放资源后，row中的值会被释放，奇怪的是password和state并没有被释放，id和name值为空
                // mysql_free_result(res);
                // return User(atoi(row[0]), row[1], row[2], row[3]);
            }
        }
    }
    return User();
}

bool UserModel::updateState(User &user)
{
    char sql[1024] = {0};
    sprintf(sql, "update user set state = '%s' where id = %d;",
            user.getState().c_str(), user.getId());
    MySQL mysql;
    if (mysql.connect())
    {
        if (mysql.update(sql))
        {
            return true;
        }
    }
    return false;
}